package com.spc.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class TreeClient {
    /**
     * 根节点
     */
    private final TreeNode rootNode;

    /**
     * 子节点
     */
    private final List<TreeNode> nodeList;

    /**
     * 构建client
     */
    public TreeClient(TreeNode treeNode, List<TreeNode> nodeList) {
        this.rootNode = treeNode;
        this.nodeList = nodeList;
    }

    /**
     * 构建整棵树
     */
    public TreeNode buildTree() {
        List<TreeNode> treeNodes = new ArrayList<TreeNode>();
        for (TreeNode tempNode : nodeList) {
            if (Objects.equals(tempNode.getParentId(), rootNode.getId())) {
                tempNode = obtainChildTree(tempNode);
                treeNodes.add(tempNode);
            }
        }
        rootNode.setChildren(treeNodes);
        return rootNode;
    }

    /**
     * 构建子树
     */
    private TreeNode obtainChildTree(TreeNode pNode) {
        List<TreeNode> childTree = new ArrayList<>();
        // nodeList：所有节点集合（所有数据）
        for (TreeNode treeNode : nodeList) {
            // 判断当前节点的父节点ID是否等于根节点的ID，即当前节点为其下的子节点
            if (treeNode.getParentId().equals(pNode.getId())) {
                // 再递归进行判断当前节点的情况，调用自身方法
                childTree.add(obtainChildTree(treeNode));
            }
        }
        // for循环结束，即节点下没有任何节点，树形构建结束，设置树结果
        pNode.setChildren(childTree);
        return pNode;
    }
}
